
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.net.URL;
import org.junit.Test;

/**
 * 根据数据库和数据表,生成相应的代码
 */
public class CodeGenerator {

  @Test
  public void main() {
    System.out.println("=================== 开始生成代码 ===================");

    ///////////////////////////////////////////
    //            代码生成器的全局配置
    ///////////////////////////////////////////
    // 配置模块名
    String moduleName = "serviceedu" ;
    String []includeTable = {"edu_teacher"} ;
    String projectPath = "C:/Users/Administrator/Desktop/java_proj/edu/service/service-edu" ;

    // 1. 创建代码生成器
    AutoGenerator autoGenerator = new AutoGenerator() ;

    //////////////////////////////////////////////////////
    //              配置代码生成器全局信息
    //////////////////////////////////////////////////////

    // 2. 全局配置信息
    GlobalConfig globalConfig = new GlobalConfig() ;
    // 设置生成文件的输出路径
    globalConfig.setOutputDir(projectPath + "/src/main/java") ;
    // 设置生成文件的作者
    globalConfig.setAuthor("zhouhuo") ;
    // 设置生成文件后是否打开资源管理器
    globalConfig.setOpen(false) ;
    // 重新生成文件时,是否覆盖文件
    globalConfig.setFileOverride(false) ;
    // 去除生成 Service 接口名称前的 I
//     globalConfig.setServiceName("%sService") ;
    // 设置主键生成策略
    globalConfig.setIdType(IdType.ID_WORKER_STR) ;
    // 生成实体类的日期类型
    globalConfig.setDateType(DateType.ONLY_DATE) ;
    // 是否开启 Swagger2
    globalConfig.setSwagger2(true) ;
    autoGenerator.setGlobalConfig(globalConfig) ;

    ///////////////////////////////////////////////////
    //            配置代码生成器的数据源
    ///////////////////////////////////////////////////

    // 开始配置 数据源
    DataSourceConfig dataSourceConfig = new DataSourceConfig() ;
    // 配置数据源的 url、Driver、username、password
    dataSourceConfig.setUrl("jdbc:mysql://localhost:3306/edu?serverTimezone=GMT%2B8") ;
    dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver") ;
    dataSourceConfig.setUsername("root") ;
    dataSourceConfig.setPassword("870798657") ;
    dataSourceConfig.setDbType(DbType.MYSQL) ;
    autoGenerator.setDataSource(dataSourceConfig) ;

    ///////////////////////////////////////////////////////
    //                配置代码生成器 包名信息
    ///////////////////////////////////////////////////////
    PackageConfig packageConfig = new PackageConfig() ;
    // 配置模块名
    packageConfig.setModuleName(moduleName) ;
    // 配置父级包名称
    packageConfig.setParent("com.zhouhuo") ;
    // 配置 控制器包名称
    packageConfig.setController("controller") ;
    // 配置 实体类包名
    packageConfig.setEntity("entity") ;
    // 配置 service 包名称
    packageConfig.setService("service") ;
    // 配置 mapper 包名称
    packageConfig.setMapper("mapper") ;
    autoGenerator.setPackageInfo(packageConfig) ;

    ///////////////////////////////////////////////////////
    //                代码生成器 生成策略配置
    ///////////////////////////////////////////////////////
    StrategyConfig strategyConfig = new StrategyConfig() ;
    // 设置包含数据表
    strategyConfig.setInclude(includeTable) ;
    // 设置数据库映射到实体命名策略
    strategyConfig.setNaming(NamingStrategy.underline_to_camel) ;
    // 生成实体类去掉表前缀
    strategyConfig.setTablePrefix(packageConfig.getModuleName()+"_") ;
    // 表字段映射到实体的命名策略
    strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel) ;
    // 支持 lombok @Accessors(chain = true) setter链式操作
    strategyConfig.setEntityLombokModel(true) ;
    // 支持 restful api 风格的 controller
    strategyConfig.setRestControllerStyle(true) ;
    // url 中驼峰转连字符
    strategyConfig.setControllerMappingHyphenStyle(true) ;
    autoGenerator.setStrategy(strategyConfig) ;

    // 执行代码生成
    autoGenerator.execute();
  }


}
